<!DOCTYPE html>
<title>CSS Anchor Positioning: try-tactic, position-area</title>
<link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/#typedef-position-try-fallbacks-try-tactic">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
  #cb {
    position: absolute;
    width: 400px;
    height: 400px;
    border: 1px solid black;
  }
  #anchor {
    position: absolute;
    left: 150px;
    top: 150px;
    width: 100px;
    height: 50px;
    background-color: coral;
  }
  #target {
    position: absolute;
    left: 450px; /* force fallback */
    width: 40px;
    height: 40px;
    background-color: skyblue;
  }
</style>
<style id=style>
</style>
<div id=cb>
  <div id=target></div>
</div>
<script>

function test_computed_value(try_tactic, property, value, expected, direction, writing_mode) {
  if (direction==undefined) {
    direction = 'ltr';
  }
  if (writing_mode==undefined) {
    writing_mode = 'horizontal-tb';
  }
  test((t) => {
    t.add_cleanup(() => {
      style.textContent = '';
      document.documentElement.style = '';
    });
    document.documentElement.style.direction = direction;
    document.documentElement.style.writingMode = writing_mode;
    style.textContent = `
      @position-try --pf {
        inset: initial;
        ${property}:${value};
      }
      #target {
        position-try-fallbacks: --pf ${try_tactic};
      }
    `;
    assert_equals(getComputedStyle(target).getPropertyValue(property), expected);
  }, `${try_tactic}, ${property}:${value}, ${direction} ${writing_mode}`);
}


// Physical:

test_computed_value('flip-inline', 'position-area', 'left top', 'right top');
test_computed_value('flip-inline', 'position-area', 'left bottom', 'right bottom');
test_computed_value('flip-inline', 'position-area', 'right bottom', 'left bottom');
test_computed_value('flip-inline', 'position-area', 'right top', 'left top');

test_computed_value('flip-block', 'position-area', 'left top', 'left bottom');
test_computed_value('flip-block', 'position-area', 'left bottom', 'left top');
test_computed_value('flip-block', 'position-area', 'right bottom', 'right top');
test_computed_value('flip-block', 'position-area', 'right top', 'right bottom');

test_computed_value('flip-block flip-inline', 'position-area', 'left top', 'right bottom');
test_computed_value('flip-block flip-inline', 'position-area', 'left bottom', 'right top');
test_computed_value('flip-block flip-inline', 'position-area', 'right bottom', 'left top');
test_computed_value('flip-block flip-inline', 'position-area', 'right top', 'left bottom');

test_computed_value('flip-start', 'position-area', 'left top', 'left top');
test_computed_value('flip-start', 'position-area', 'left bottom', 'right top');
test_computed_value('flip-start', 'position-area', 'right bottom', 'right bottom');
test_computed_value('flip-start', 'position-area', 'right top', 'left bottom');

test_computed_value('flip-block flip-start', 'position-area', 'left top', 'right top');
test_computed_value('flip-block flip-start', 'position-area', 'left bottom', 'left top');
test_computed_value('flip-block flip-start', 'position-area', 'right bottom', 'left bottom');
test_computed_value('flip-block flip-start', 'position-area', 'right top', 'right bottom');

test_computed_value('flip-inline flip-start', 'position-area', 'left top', 'left bottom');
test_computed_value('flip-inline flip-start', 'position-area', 'left bottom', 'right bottom');
test_computed_value('flip-inline flip-start', 'position-area', 'right bottom', 'right top');
test_computed_value('flip-inline flip-start', 'position-area', 'right top', 'left top');

test_computed_value('flip-block flip-inline flip-start', 'position-area', 'left top', 'right bottom');
test_computed_value('flip-block flip-inline flip-start', 'position-area', 'left bottom', 'left bottom');
test_computed_value('flip-block flip-inline flip-start', 'position-area', 'right bottom', 'left top');
test_computed_value('flip-block flip-inline flip-start', 'position-area', 'right top', 'right top');

// Variations:
test_computed_value('flip-block flip-inline', 'position-area', 'span-left span-top', 'span-right span-bottom');

// XY:

test_computed_value('flip-inline', 'position-area', 'x-start y-start', 'x-end y-start');
test_computed_value('flip-inline', 'position-area', 'x-start y-end', 'x-end y-end');
test_computed_value('flip-inline', 'position-area', 'x-end y-end', 'x-start y-end');
test_computed_value('flip-inline', 'position-area', 'x-end y-start', 'x-start y-start');

test_computed_value('flip-block', 'position-area', 'x-start y-start', 'x-start y-end');
test_computed_value('flip-block', 'position-area', 'x-start y-end', 'x-start y-start');
test_computed_value('flip-block', 'position-area', 'x-end y-end', 'x-end y-start');
test_computed_value('flip-block', 'position-area', 'x-end y-start', 'x-end y-end');

test_computed_value('flip-block flip-inline', 'position-area', 'x-start y-start', 'x-end y-end');
test_computed_value('flip-block flip-inline', 'position-area', 'x-start y-end', 'x-end y-start');
test_computed_value('flip-block flip-inline', 'position-area', 'x-end y-end', 'x-start y-start');
test_computed_value('flip-block flip-inline', 'position-area', 'x-end y-start', 'x-start y-end');

test_computed_value('flip-start', 'position-area', 'x-start y-start', 'x-start y-start');
test_computed_value('flip-start', 'position-area', 'x-start y-end', 'x-end y-start');
test_computed_value('flip-start', 'position-area', 'x-end y-end', 'x-end y-end');
test_computed_value('flip-start', 'position-area', 'x-end y-start', 'x-start y-end');

test_computed_value('flip-block flip-start', 'position-area', 'x-start y-start', 'x-end y-start');
test_computed_value('flip-block flip-start', 'position-area', 'x-start y-end', 'x-start y-start');
test_computed_value('flip-block flip-start', 'position-area', 'x-end y-end', 'x-start y-end');
test_computed_value('flip-block flip-start', 'position-area', 'x-end y-start', 'x-end y-end');

test_computed_value('flip-inline flip-start', 'position-area', 'x-start y-start', 'x-start y-end');
test_computed_value('flip-inline flip-start', 'position-area', 'x-start y-end', 'x-end y-end');
test_computed_value('flip-inline flip-start', 'position-area', 'x-end y-end', 'x-end y-start');
test_computed_value('flip-inline flip-start', 'position-area', 'x-end y-start', 'x-start y-start');

test_computed_value('flip-block flip-inline flip-start', 'position-area', 'x-start y-start', 'x-end y-end');
test_computed_value('flip-block flip-inline flip-start', 'position-area', 'x-start y-end', 'x-start y-end');
test_computed_value('flip-block flip-inline flip-start', 'position-area', 'x-end y-end', 'x-start y-start');
test_computed_value('flip-block flip-inline flip-start', 'position-area', 'x-end y-start', 'x-end y-start');

// Variations:
test_computed_value('flip-block flip-inline', 'position-area', 'span-x-start span-y-start', 'span-x-end span-y-end');
test_computed_value('flip-block flip-inline', 'position-area', 'x-self-start y-self-start', 'x-self-end y-self-end');
test_computed_value('flip-block flip-inline', 'position-area', 'span-x-self-start span-y-self-start', 'span-x-self-end span-y-self-end');

// Logical:

test_computed_value('flip-inline', 'position-area', 'block-start inline-start', 'block-start inline-end');
test_computed_value('flip-inline', 'position-area', 'block-end inline-start', 'block-end inline-end');
test_computed_value('flip-inline', 'position-area', 'block-end inline-end', 'block-end inline-start');
test_computed_value('flip-inline', 'position-area', 'block-start inline-end', 'block-start inline-start');

test_computed_value('flip-block', 'position-area', 'block-start inline-start', 'block-end inline-start');
test_computed_value('flip-block', 'position-area', 'block-end inline-start', 'block-start inline-start');
test_computed_value('flip-block', 'position-area', 'block-end inline-end', 'block-start inline-end');
test_computed_value('flip-block', 'position-area', 'block-start inline-end', 'block-end inline-end');

test_computed_value('flip-block flip-inline', 'position-area', 'block-start inline-start', 'block-end inline-end');
test_computed_value('flip-block flip-inline', 'position-area', 'block-end inline-start', 'block-start inline-end');
test_computed_value('flip-block flip-inline', 'position-area', 'block-end inline-end', 'block-start inline-start');
test_computed_value('flip-block flip-inline', 'position-area', 'block-start inline-end', 'block-end inline-start');

test_computed_value('flip-start', 'position-area', 'block-start inline-start', 'block-start inline-start');
test_computed_value('flip-start', 'position-area', 'block-end inline-start', 'block-start inline-end');
test_computed_value('flip-start', 'position-area', 'block-end inline-end', 'block-end inline-end');
test_computed_value('flip-start', 'position-area', 'block-start inline-end', 'block-end inline-start');

test_computed_value('flip-block flip-start', 'position-area', 'block-start inline-start', 'block-start inline-end');
test_computed_value('flip-block flip-start', 'position-area', 'block-end inline-start', 'block-start inline-start');
test_computed_value('flip-block flip-start', 'position-area', 'block-end inline-end', 'block-end inline-start');
test_computed_value('flip-block flip-start', 'position-area', 'block-start inline-end', 'block-end inline-end');

test_computed_value('flip-inline flip-start', 'position-area', 'block-start inline-start', 'block-end inline-start');
test_computed_value('flip-inline flip-start', 'position-area', 'block-end inline-start', 'block-end inline-end');
test_computed_value('flip-inline flip-start', 'position-area', 'block-end inline-end', 'block-start inline-end');
test_computed_value('flip-inline flip-start', 'position-area', 'block-start inline-end', 'block-start inline-start');

test_computed_value('flip-block flip-inline flip-start', 'position-area', 'block-start inline-start', 'block-end inline-end');
test_computed_value('flip-block flip-inline flip-start', 'position-area', 'block-end inline-start', 'block-end inline-start');
test_computed_value('flip-block flip-inline flip-start', 'position-area', 'block-end inline-end', 'block-start inline-start');
test_computed_value('flip-block flip-inline flip-start', 'position-area', 'block-start inline-end', 'block-start inline-end');

// Variations:
test_computed_value('flip-block flip-inline', 'position-area', 'span-block-start span-inline-start', 'span-block-end span-inline-end');
test_computed_value('flip-block flip-inline', 'position-area', 'self-block-start self-inline-start', 'self-block-end self-inline-end');
test_computed_value('flip-block flip-inline', 'position-area', 'span-self-block-start span-self-inline-start', 'span-self-block-end span-self-inline-end');

// start/end

test_computed_value('', 'position-area', 'start end', 'start end');

test_computed_value('flip-block', 'position-area', 'start end', 'end');

test_computed_value('flip-inline', 'position-area', 'start end', 'start');

test_computed_value('flip-block flip-inline', 'position-area', 'start end', 'end start');

test_computed_value('flip-start', 'position-area', 'start', 'start');
test_computed_value('flip-start', 'position-area', 'end', 'end');
test_computed_value('flip-start', 'position-area', 'start end', 'end start');

test_computed_value('flip-block flip-start', 'position-area', 'start end', 'end');

test_computed_value('flip-inline flip-start', 'position-area', 'start end', 'start');

test_computed_value('flip-block flip-inline flip-start', 'position-area', 'start end', 'start end');

// Variations:

test_computed_value('flip-block flip-inline', 'position-area', 'span-start span-end', 'span-end span-start');
test_computed_value('flip-block flip-inline', 'position-area', 'self-start self-end', 'self-end self-start');
test_computed_value('flip-block flip-inline', 'position-area', 'span-self-start span-self-end', 'span-self-end span-self-start');

// center
test_computed_value('flip-block', 'position-area', 'left center', 'left center');
test_computed_value('flip-block', 'position-area', 'center top', 'center bottom');
test_computed_value('flip-block', 'position-area', 'center', 'center');
test_computed_value('flip-block', 'position-area', 'start center', 'end center');
test_computed_value('flip-block', 'position-area', 'center start', 'center start');
test_computed_value('flip-inline', 'position-area', 'center start', 'center end');
test_computed_value('flip-start', 'position-area', 'center start', 'start center');

// span-all
test_computed_value('flip-block', 'position-area', 'left span-all', 'left');
test_computed_value('flip-block', 'position-area', 'span-all top', 'bottom');
test_computed_value('flip-block', 'position-area', 'span-all', 'span-all');
test_computed_value('flip-block', 'position-area', 'start span-all', 'end span-all');
test_computed_value('flip-block', 'position-area', 'span-all start', 'span-all start');
test_computed_value('flip-inline', 'position-area', 'span-all start', 'span-all end');
test_computed_value('flip-start', 'position-area', 'span-all start', 'start span-all');

// Span mix:
test_computed_value('flip-block', 'position-area', 'left span-top', 'left span-bottom');
test_computed_value('flip-inline', 'position-area', 'left span-top', 'right span-top');
test_computed_value('flip-start', 'position-area', 'span-block-start inline-end', 'block-end span-inline-start');

// Writing modes:
test_computed_value('flip-block', 'position-area', 'left top', 'right top', 'ltr', 'vertical-rl');

test_computed_value('', 'position-area', 'x-start y-start', 'x-start y-start', 'rtl');
test_computed_value('flip-block', 'position-area', 'x-start y-start', 'x-start y-end', 'rtl');
test_computed_value('flip-inline', 'position-area', 'x-start y-start', 'x-end y-start', 'rtl');
test_computed_value('flip-block', 'position-area', 'x-end y-start', 'x-start y-start', 'ltr', 'vertical-rl');
test_computed_value('flip-inline', 'position-area', 'x-end y-start', 'x-end y-end', 'ltr', 'vertical-rl');

test_computed_value('flip-inline', 'position-area', 'start end', 'start', 'rtl');
test_computed_value('flip-inline', 'position-area', 'start end', 'start', 'ltr', 'vertical-rl');
test_computed_value('flip-block', 'position-area', 'start end', 'end', 'rtl');
test_computed_value('flip-block', 'position-area', 'start end', 'end', 'ltr', 'vertical-rl');

</script>
